package pildemil

import com.google.appengine.api.datastore.*


class DepenseController {

	def persistenceManager
	def transactionService
    
    static allowedMethods = [ajouter:'POST', sauver:'POST']

	def index = {
		redirect(action:'liste')
	}
	
	def liste = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		def transaction = persistenceManager.currentTransaction()
		
		transactionService.calculMaj(projet)
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
		}
		
		def listeDepense = getDepenses(projet)
		render(view:"liste", model:['listeDepense':listeDepense])
	}
	
	def creer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		def listeParticipant = projet.participants
		Depense depense = new Depense(params)
		depense.payeur = projet.responsable
		depense.consommateurs = new ArrayList<Key>()
		projet.participants.each {
			depense.consommateurs.add(it.key)
		}
		
		render(view:"creer", model:['depense': depense, 'listeParticipant':listeParticipant])
	}
	
	def ajouter = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
			
		Depense depense = new Depense(params)
		depense.consommateurs = new ArrayList<Key>()
		
		println params
		
		if (params.payeurKeyId) {
			def payeurKey = KeyFactory.createKey(projetKey, Participant.simpleName, params.payeurKeyId.toInteger())
			depense.payeur = payeurKey
		}
		def consommateursKeyId = params.list("consommateursKeyId")
		if (consommateursKeyId) {
			consommateursKeyId.each {
				def consommateursKey = KeyFactory.createKey(projetKey, Participant.simpleName, it.toInteger())
				depense.consommateurs.add(consommateursKey)
			}
		}
		
		depense.projet = projet
		projet.depenses << depense
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
		
			redirect("action":liste)
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			def listeParticipant = projet.participants
			render(view:"creer", model:['depense': depense, 'listeParticipant':listeParticipant])
		}
	}
	
	def editer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def depenseKey = KeyFactory.createKey(projetKey, Depense.simpleName, params.id.toInteger())
	    Depense depense = persistenceManager.getObjectById(Depense.class, depenseKey)	
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			depense = persistenceManager.detachCopy(depense)
			transaction.commit()
			
			def listeParticipant = projet.participants
			render(view:"editer", model:['depense': depense, 'listeParticipant':listeParticipant])
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			redirect("action":liste)
		}		
	}
	
	def sauver = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def depenseKey = KeyFactory.createKey(projetKey, Depense.simpleName, params.id.toInteger())
	    Depense depense = persistenceManager.getObjectById(Depense.class, depenseKey)
		
		if (params.payeurKeyId) {
			def payeurKey = KeyFactory.createKey(projetKey, Participant.simpleName, params.payeurKeyId.toInteger())
			depense.payeur = payeurKey			
		}
		def consommateursKeyId = params.list("consommateursKeyId")
		if (consommateursKeyId) {
			depense.consommateurs.clear()
			consommateursKeyId.each {
				def consommateursKey = KeyFactory.createKey(projetKey, Participant.simpleName, it.toInteger())
				depense.consommateurs.add(consommateursKey)
			}
		}
		depense.properties = params
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
		
			redirect("action":liste)
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			def listeParticipant = projet.participants	
			render(view:"editer", model:['depense': depense, 'listeParticipant':listeParticipant])
		}
	}
	
	def supprimer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def depenseKey = KeyFactory.createKey(projetKey, Depense.simpleName, params.id.toInteger())
	    Depense depense = persistenceManager.getObjectById(Depense.class, depenseKey)	
				
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
            persistenceManager.deletePersistent(depense)
			transaction.commit()
        } catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
        }
			
		redirect("action":liste)
	}
	
	/* FONCTIONS DE RECUPERATION */
	
	def getDepenses(Projet projet) {
		def depensesVal = projet.depenses
		depensesVal.each { depense ->
			Participant payeur = persistenceManager.getObjectById(Participant.class, depense.payeur)
			depense.nomPayeur = payeur.nom
			depense.nomsConsommateurs.clear()
			depense.consommateurs.each {
				Participant consommateur = persistenceManager.getObjectById(Participant.class, it)
				depense.nomsConsommateurs.add(consommateur.nom)
			}
		}
	}
}
